package com.huang.progressarcdemo;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RectF;
import android.graphics.Typeface;
import android.util.AttributeSet;
import android.view.View;


/**
 *
 *
 * Created by huangRZ on 2016/9/5.
 */
public class ProgressArc extends View {

    /** 关于圆形进度条的所有属性 */
    private int roundColor; //圆弧背景颜色
    private int roundProgressColor; //圆弧前景颜色（进度条颜色）
    private float roundWidth; //圆弧的宽度（笔尖的直径）

    private int innerTextColor; //圆弧内文字颜色
    private float innerTextSize; //圆弧内文字大小

    private boolean isTextDisplay; //是否显示文本
    private int style;  //显示样式（圆弧（STROKE）还是整个圆(FILL)）
    private boolean isFillCenter;

    public static final int STROKE = 0;
    public static final int FILL = 1;

    /** 需要用到的一些参数 */
    private Paint paint; //画笔

    private int max = 0; //进度最大值
    private int startProgress = 0;
    private int mCurrentProgress = 0; //当前进度

    private RectF oval; //矩形：用于定义圆弧大小和形状的界面
    private int center; //圆环中心x坐标
    private int radius; //圆环半径（要画的圆弧的笔的笔尖所有的圆弧的半径）

    public ProgressArc(Context context) {
        this(context, null);
    }

    public ProgressArc(Context context, AttributeSet attrs) {
        this(context, attrs,0);
    }

    public ProgressArc(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        initAttribute(context, attrs);
        paint = new Paint();//创建画笔
    }

    private void initAttribute(Context context, AttributeSet attrs) {
        /** 获取自定义属性和默认值 */
        TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.ProgressArc);

        roundColor = array.getColor(R.styleable.ProgressArc_roundColor, Color.rgb(100,100,100));
        roundProgressColor = array.getColor(R.styleable.ProgressArc_roundProgressColor, Color.rgb(255,0,0));
        innerTextColor = array.getColor(R.styleable.ProgressArc_innerTextColor, Color.rgb(255,0,0));
        isTextDisplay = array.getBoolean(R.styleable.ProgressArc_isTextDisplay, true);
        innerTextSize = array.getDimension(R.styleable.ProgressArc_innerTextSize, 16f);
        style = array.getInt(R.styleable.ProgressArc_style, STROKE);
        roundWidth = array.getDimension(R.styleable.ProgressArc_roundWidth, 10);
        isFillCenter = array.getBoolean(R.styleable.ProgressArc_isFillCenter, false);

        array.recycle();//循环该数组，等待下一次调用时重复利用，在这期间不能再使用这个数组
    }

    /**
     * 测量view的数据
     */
    private void measure() {

        /** 获取圆环中心x坐标 */
        center = getWidth()/2;

        /** 计算出要画圆弧的圆弧半径  roundWidth为笔尖的粗细（直径），除2是计算笔尖的中心位置 */
        radius = (int) (center - roundWidth/2);

        /** 获取一个矩形：用于定义圆弧大小和形状的界面 */
        oval = new RectF(center - radius, center - radius, center + radius, center + radius);
    }


    /** 必须要实现的方法 */
    @Override
    protected void onDraw(Canvas canvas) {

        measure();//测量圆环的数据

        /**
         * 画出圆环背景
         */
        /** 设置画圆环背景颜色的画笔颜色 */
        paint.setColor(roundColor);

        /** 设置画笔的粗细 */
        paint.setStrokeWidth(roundWidth);

        /** 设置画笔样式:实心 */
        paint.setStyle(Paint.Style.STROKE);

        /** 设置抗锯齿效果 使圆弧更圆润*/
        paint.setAntiAlias(true);

        /** 画出圆 参数：1：中心x坐标  2：中心y坐标  3、圆的半径  4、画笔 */
        canvas.drawCircle(center, center, radius, paint);

        /**
         * 画出圆弧进度条
         */
        /** 设置画圆弧前景颜色的画笔颜色 */
        paint.setColor(roundProgressColor);

        /** 判断是显示扇形还是圆弧 */
        if (isFillCenter && mCurrentProgress != 0){
            /** 设置画笔样式:空心 */
            paint.setStyle(Paint.Style.FILL_AND_STROKE);

            /** 画圆弧 参数：1：限定圆弧大小和形状的矩形  2：开始角度  3、结束角度  4、是否连接中心  5、画笔 */
            canvas.drawArc(oval, -90f, 360f*mCurrentProgress/max, true, paint);
        } else {
            canvas.drawArc(oval, -90f, 360f*mCurrentProgress/max, false, paint);
        }

        /** 判断是否显示文字 */
        if (isTextDisplay) {
            /**
             * 画出圆环内的文字
             */
            /** 文字颜色 */
            paint.setColor(innerTextColor);

            /** 画笔的大小：0 */
            paint.setStrokeWidth(0);

            /** 文字大小 */
            paint.setTextSize(innerTextSize);

            /** 设置字体：默认 */
            paint.setTypeface(Typeface.DEFAULT);

            /** 中间的进度百分比，先转换成float在进行除法运算，不然都为0  */
            int percent = (int) (((float) mCurrentProgress / (float) max) * 100);

            /** 测量字体的宽度，确保文字显示在圆环中心 */
            float width = paint.measureText(percent + "%");

            /** 文字进度 参数：1：文字内容 2：文字开始的x坐标 3:文字的基线y坐标 */
            canvas.drawText(percent+"%", center - width / 2, center + innerTextSize / 2-1, paint);
        }
    }

    /** 设置进度的最大值 */
    public synchronized void setMax(int max) {
        if (max < 0) {
            throw new IllegalArgumentException("max not less than 0");
        }
        this.max = max;

    }

    /** 设置当前进度值，加锁可以在多线程中使用而不会出现线程安全问题 */
    public synchronized void setmCurrentProgress(int mCurrentProgress) {
        if (mCurrentProgress < 0) {
            throw new IllegalArgumentException("progress not less than 0");
        }
        if (mCurrentProgress > max) {
            mCurrentProgress = max;
        }
        if (mCurrentProgress <= max) {
            this.mCurrentProgress = mCurrentProgress;
            /** 可以在不是UI线程的线程中刷新UI */
            postInvalidate();
        }

    }

    public synchronized int getMax() {
        return max;
    }

    public synchronized int getmCurrentProgress() {
        return mCurrentProgress;
    }

    public int getRoundColor() {
        return roundColor;
    }

    public void setRoundColor(int roundColor) {
        this.roundColor = roundColor;
    }

    public int getRoundProgressColor() {
        return roundProgressColor;
    }

    public void setRoundProgressColor(int roundProgressColor) {
        this.roundProgressColor = roundProgressColor;
    }

    public float getRoundWidth() {
        return roundWidth;
    }

    public void setRoundWidth(float roundWidth) {
        this.roundWidth = roundWidth;
    }

    public int getInnerTextColor() {
        return innerTextColor;
    }

    public void setInnerTextColor(int innerTextColor) {
        this.innerTextColor = innerTextColor;
    }

    public float getInnerTextSize() {
        return innerTextSize;
    }

    public void setInnerTextSize(float innerTextSize) {
        this.innerTextSize = innerTextSize;
    }

    public boolean isTextDisplay() {
        return isTextDisplay;
    }

    public void setTextDisplay(boolean textDisplay) {
        isTextDisplay = textDisplay;
    }

    public int getStyle() {
        return style;
    }

    public void setStyle(int style) {
        this.style = style;
    }

    public boolean isFillCenter() {
        return isFillCenter;
    }

    public void setFillCenter(boolean fillCenter) {
        isFillCenter = fillCenter;
    }
}